# { config, lib, pkgs, ... }:

{
  # 文件描述，随便写
  description = "Nixos flake 配置";

  # 输入配置，即软件源 网络不好，容易失败
  #inputs 是 flake 的依赖，outputs 是 flake 的输出
  # inputs 中的每一项依赖都会在被拉取、构建后，作为参数传递给 outputs 函数
  inputs = {
    # NixOS 官方软件源，这里使用 nixos-unstable 分支
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    # nur 源
    #nur = {
    #  url = "github:nix-community/NUR";
      # `follows` 是 inputs 中的继承语法
      # 这里使 sops-nix 的 `inputs.nixpkgs` 与当前 flake 的
      # `inputs.nixpkgs` 保持一致，避免依赖的 nixpkgs 版本不一致导致问题
      #inputs.nixpkgs.follows = "nixpkgs";
    #};
    #nvimdots.url = "github:ayamir/nvimdots";
    # home
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    # Emacs Overlay
    ## emacs-overlay.url = "github:nix-community/emacs-overlay";
    ## emacs-overlay.inputs.nixpkgs.follows = "nixpkgs";
  };

  # outputs 即 flake 的所有输出，其中的 nixosConfigurations 即 NixOS 系统配置
  # flake 有很多用途，也可以有很多不同的 outputs，nixosConfigurations 只是其中一种
  #
  # outputs 是一个函数，它的参数都在 inputs 中定义，可以通过 inputs 中定义的名称来引用。
  # 比如这里的输入参数 `nixpkgs`，就是上面 inputs 中的 `nixpkgs`
  # 不过 self 是个例外，这个特殊参数指向 outputs 自身（自引用），以及 flake 根目录
  # 这里的 @ 语法将函数的参数 attribute set 取了个别名，方便在内部使用
  outputs = inputs@{ self, nixpkgs, home-manager, ... }:
    (let
      system = "x86_64-linux";
      # systemVersion = "23.05";
      # username = "l";
      # hostname = "nixos";

      specialArgs = {
        configurationPath = builtins.toString self;
        nixpkgsPath = builtins.toString nixpkgs;
      };

      genRev = {
        system.configurationRevision = self.rev or null;
        system.nixos.label =
          with builtins;
            if self.sourceInfo ? lastModifiedDate && self.sourceInfo ? shortRev
            then "${substring 0 8 self.sourceInfo.lastModifiedDate}.${self.sourceInfo.shortRev}"
            else "UnSync";
      };

    in rec {
      nixosConfigurations = {
        nixos = nixpkgs.lib.nixosSystem {
          # 引用 system = "x86_64-linux"
          inherit system specialArgs;

          modules = [

            ./hosts/nixos

            ./system/nixos

            home-manager.nixosModules.home-manager {
              home-manager.useGlobalPkgs = true;
              home-manager.useUserPackages = true;
              home-manager.extraSpecialArgs = removeAttrs inputs [ "self" ];
              # l 为个人用户名，可设置为其他用户名
              home-manager.users = {
                l = {
                  imports = [
                    ./home/nixos
                    ./home/nixos/configs
                  ];
                  #_module.args.nur = { inherit nur; };
                };
                root = import ./root;
              };
              #nixpkgs.overlays =[inputs.nur.overlay];
            }


            # 使用nur源，如果不使用，可移除
            #nur.nixosModules.nur

            #({ config, ... }: {
            #  imports = [
            #    ./nur/install-nur.nix
            #  ];
            #})
            genRev
          ];
        };
      };
    });
}
